var Curso = require('../classes/curso');
var Departamento = require('../classes/departamento');
var CursoDAO = require('../DAO/curso.dao');

function CursoMapper() {
    var dao = new CursoDAO();

    this.cursoToModel = function(c, callback) {
        var m = dao.getModel();
        m.nome = c.getNome();
        m.departamento.push({nome: c.getDepartamento()}); //beware, THIS MUST BE A MODEL
        callback(m);
    }

    this.modelToCurso = function(m, callback) {
        if (m instanceof Array) {
            var out = [];
            m.forEach(function(i) {
                var c = new Curso();
                var dep = new Departamento();
                dep.setNome(i.departamento[0].nome);
                c.setNome(i.nome);
                c.setDepartamento(dep);
                c.setId(i._id);
                out.push(c);
            });
            callback(out);
        }
        else {
            var c = new Curso();
            var dep = new Departamento();
            dep.setNome(m.departamento[0].nome);
            c.setNome(m.nome);
            c.setDepartamento(dep);
            c.setId(m._id);
            callback(c);
        }
    }

    this.add = function(curso, callback) {
        this.cursoToModel(curso, function(m) {
            dao.add(m, callback);
        });
    }

    this.get = function(curso, callback) {
        var that = this;
        this.cursoToModel(curso, function(m) {
            dao.get(m, function(err, data) {
                if(err) throw err;
                if(!data) throw new Error('Not found!');
                that.modelToCurso(data, function(c) {
                    callback(err, c);
                });
            });
        });
    }

    this.getById = function(id, callback) {
        var that = this;
        dao.getById(id, function(err, doc) {
            if(err) throw new Error('Not found!');
            that.modelToCurso(doc, function(c) {
                callback(err, c);
            });
        });
    }

    //FIXME
    this.update = function(id, secretario) {
        this.cursoToModel(curso, function(m) {
            dao.update(id, m);
        });
    }

    this.remove = function(curso, callback) {
        this.cursoToModel(curso, function(m) {
            dao.remove(m, callback);
        });
    }

    this.getAll = function(callback) {
        var that = this;
        dao.getAll(function(err, all) {
            that.modelToCurso(all, function(all) {
                callback(err, all);
            });
        });
    }
}

module.exports = CursoMapper;
